﻿// 204. 表达整数的奇怪方式.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>


using namespace std;

/*

https://www.acwing.com/problem/content/206/

给定 2n 个整数 a1,a2,…,an 和 m1,m2,…,mn，求一个最小的非负整数 x，满足 ∀i∈[1,n],x≡mi(mod ai)。

输入格式
第 1 行包含整数 n。

第 2…n+1 行：每 i+1 行包含两个整数 ai 和 mi，数之间用空格隔开。

输出格式
输出最小非负整数 x，如果 x 不存在，则输出 −1。
如果存在 x，则数据保证 x 一定在 64 位整数范围内。

数据范围
1≤ai≤2^31−1,
0≤mi<ai
1≤n≤25
输入样例：
2
8 7
11 9
输出样例：
31
*/


typedef long long  LL;

LL exgcd(LL a, LL b, LL& x, LL& y) {
	if (!b) {
		x = 1, y = 0;
		return a;
	}

	LL d = exgcd(b, a % b, y, x);
	y -= a / b * x;
	return d;
}

int n;
const int N = 30;
int a[N], m[N];

int main()
{
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> a[i] >> m[i];
	}
	LL a0 = a[0], m0 = m[0];
	LL x = 0;
	for (int i = 1; i < n; i++) {
		LL a1 = a[i], m1 = m[i];
		LL k1, k0;
		LL d = exgcd(a0,a1,k0,k1);
		if ((m1 - m0) % d != 0) {
			x = -1; break;
		}
		k0 = k0 * (m1 - m0) / d;
		k0 = (k0 % (a1 / d) + a1 / d) % (a1 / d);

		x = k0 * a0 + m0;

		m0 = a0 * k0 + m0;
		a0 = a0 /d* a1;
	}

	if (x != -1) x = (m0 % a0 + a0) % a0;
	cout << x << endl;

	return 0;
}

 



//typedef long long  LL;
//
//LL exgcd(LL a, LL b, LL& x, LL& y) {
//	if (!b) {
//		x = 1, y = 0;
//		return a;
//	}
//
//	LL d = exgcd(b, a % b, y, x);
//	y -= a / b * x;
//	return d;
//}
//
//
//int main()
//{
//	int n;
//	cin >> n;
//	LL x = 0, a1, m1;
//	cin >> a1 >> m1;
//	for (int i = 0; i < n - 1; i++) {
//		LL a2, m2;
//		cin >> a2 >> m2;
//		LL k1, k2;
//		LL d = exgcd(a1, a2, k1, k2);
//		if ((m2 - m1) % d) {
//			x = -1;
//			break;
//		}
//
//		k1 *= (m2 - m1) / d;
//		k1 = (k1 % (a2 / d) + a2 / d) % (a2 / d);
//
//		x = k1 * a1 + m1;
//
//		m1 = k1 * a1 + m1;
//		a1 = a1 / d * a2;
//	}
//
//	if (x != -1) x = (m1 % a1 + a1) % a1;
//
//	cout << x << endl;
//
//
//	return 0;
//}
//
